// To DeepSeek:
// 帮我下一段js代码，判断给定的两个dayjs对象之间的 时间范围，与给定的两个字符串（HH:mm:ss格式）时间重叠的时间长度，字符串可能结束时间小于开始时间，即表示是第二天，结果只需要秒级就够了

import dayjs from "dayjs";
import minMax from "dayjs/plugin/minMax";
dayjs.extend(minMax);

/**
 * 计算两个时间范围之间的重叠秒数
 * @param {dayjs.Dayjs} range1Start - 第一个时间范围的开始时间
 * @param {dayjs.Dayjs} range1End - 第一个时间范围的结束时间
 * @param {string} timeStr1 - 第二个时间范围的开始时间（HH:mm:ss格式）
 * @param {string} timeStr2 - 第二个时间范围的结束时间（HH:mm:ss格式）
 * @returns {number} 重叠秒数（整数）
 */

function calculateOverlapDuration(range1Start, range1End, timeStr1, timeStr2) {
  // 验证时间字符串格式
  const timeRegex = /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/;
  if (!timeRegex.test(timeStr1) || !timeRegex.test(timeStr2)) {
    throw new Error("时间格式应为HH:mm:ss");
  }

  // 解析HH:mm:ss格式的时间字符串
  const parseTime = (timeStr) => {
    const [hours, minutes, seconds] = timeStr.split(":").map(Number);
    return hours * 3600 + minutes * 60 + seconds;
  };

  const time1Sec = parseTime(timeStr1);
  const time2Sec = parseTime(timeStr2);

  // 创建第二个时间范围的Dayjs对象（考虑跨天情况）
  let range2Start, range2End;
  const baseDate = range1Start.startOf("day");

  if (time1Sec <= time2Sec) {
    // 不跨天的情况
    range2Start = baseDate.add(time1Sec, "second");
    range2End = baseDate.add(time2Sec, "second");
  } else {
    // 跨天的情况（结束时间在第二天）
    range2Start = baseDate.add(time1Sec, "second");
    range2End = baseDate.add(time2Sec, "second").add(1, "day");
  }

  // 计算重叠时间
  const latestStart = dayjs.max(range1Start, range2Start);
  const earliestEnd = dayjs.min(range1End, range2End);
  const seconds1 = latestStart.isBefore(earliestEnd)
    ? Math.floor(earliestEnd.diff(latestStart, "second"))
    : 0;

  // 当 range1Start 与 range1End 跨天
  let range3Start, range3End;
  range3Start = range2Start.add(1, "day");
  range3End = range2End.add(1, "day");

  // 计算重叠时间
  const latestStart2 = dayjs.max(range1Start, range3Start);
  const earliestEnd2 = dayjs.min(range1End, range3End);
  const seconds2 = latestStart2.isBefore(earliestEnd2)
    ? Math.floor(earliestEnd2.diff(latestStart2, "second"))
    : 0;

  // 返回重叠秒数（整数）
  return seconds1 + seconds2;
}

/*

// 使用示例
const rangeStart = dayjs('2023-01-01T08:00:00');
const rangeEnd = dayjs('2023-01-01T10:00:00');

// 示例1: 不跨天，有重叠
const overlap1 = calculateOverlapDuration(rangeStart, rangeEnd, '09:00:00', '09:30:00');
console.log(`重叠秒数: ${overlap1}秒`); // 输出: 1800秒（30分钟）

// 示例2: 跨天，有重叠
const overlap2 = calculateOverlapDuration(rangeStart, rangeEnd, '23:00:00', '01:00:00');
console.log(`重叠秒数: ${overlap2}秒`); // 输出: 3600秒（1小时）

// 示例3: 精确到秒的重叠
const overlap3 = calculateOverlapDuration(
    dayjs('2023-01-01T08:30:15'), 
    dayjs('2023-01-01T09:45:30'), 
    '09:00:20', 
    '09:30:40'
);
console.log(`重叠秒数: ${overlap3}秒`); // 输出: 1820秒（30分20秒）

// 示例4: 无重叠
const overlap4 = calculateOverlapDuration(rangeStart, rangeEnd, '11:00:00', '12:00:00');
console.log(`重叠秒数: ${overlap4}秒`); // 输出: 0秒

*/

export default calculateOverlapDuration;
